package cn.zebra.dev.order.module.order.service;

import cn.zebra.dev.ibatis.plus.service.IService;
import cn.zebra.dev.ibatis.plus.utils.PageUtils;
import cn.zebra.dev.order.module.order.entity.OrdersEntity;

import java.util.Collection;
import java.util.List;
import java.util.Map;

/**
 * @author runnable@sina.cn
 */
public interface OrdersService extends IService<OrdersEntity> {

    /**
     * 根据订单id和用户id查找订单信息
     *
     * @return 订单信息
     */
    OrdersEntity findByOrderNo(String orderSn);

    /**
     * 根据订单id和用户id查找订单信息
     *
     * @param orderId  订单id
     * @param memberId 用户id
     * @return 订单信息
     */
    OrdersEntity findByOrderIdAndUserId(Long orderId, Long memberId);

    /**
     * 根据订单id查找订单信息
     *
     * @param orderId 订单id
     * @return 订单信息
     */
    @Override
    OrdersEntity findById(Long orderId);

    /**
     * 根据订单parent_id字段查找订单集合
     *
     * @param parentId 上级订单id
     * @return 订单集合
     */
    Collection<OrdersEntity> findByParentId(Long parentId);

    /**
     * 根据订单编号修改订单状态和积分
     *
     * @param orderSn 订单编号
     * @param status  订单状态
     * @param point   积分
     * @return 成功返回True 失败返回False
     */
    Boolean updateOrderStatusByOrderSn(String orderSn, Integer status, Long point);

    /**
     * 根据订单id修改订单状态
     *
     * @param id           订单id
     * @param ordersStatus 订单状态
     * @return 成功返回True 失败返回False
     */
    Boolean updateOrderStatusById(Long id, Integer ordersStatus);

    /**
     * 修改用户收货地址(用户)
     *
     * @param id           订单id
     * @param addressId    用户收获地址id
     * @param ordersUserId 订单拥有者id
     * @return 修改成功返回True 修改失败返回False
     */
    Boolean updateAddressIdByIdAndOrdersUserId(Long id, Long addressId, Long ordersUserId);

    /**
     * 查找所有过期订单集合
     *
     * @return 过期订单集合
     */
    List<OrdersEntity> findExpiredOrders();

    /**
     * 更新所有过期订单
     *
     * @return 更新成功返回True 更新失败返回False
     */
    Boolean updateExpiredOrders();

    /**
     * 根据订单id和订单拥有者id取消订单
     *
     * @param id           订单id
     * @param ordersUserId 订单拥有者id
     * @return 取消成功返回True 取消失败返回False
     */
    Boolean cancel(Long id, Long ordersUserId);

    /**
     * 查询订单分页信息
     *
     * @param params -key 查询参数
     *               shopId             根据shop_id查询订单
     *               ordersUserId       根据orders_user_id查询订单
     *               ordersType         根据orders_type查询订单
     *               ordersStatus       根据orders_status订单状态查询订单
     *               ordersStatusIn     根据order_status订单状态查询包含在内的状态订单(采用IN查询条件)
     *               notShopId          不查询店铺id
     *               notOrderTitle      不查询订单标题
     *               notTotalPrice      不查询订单总金额
     *               notParentId        不查询上级订单id
     *               notOrderUserId     不查询订单用户id
     *               notTotalPoint      不查询订单总积分
     *               notOrderType       不查询订单类型
     *               notTotalNum        不查询总数量
     *               notPayTime         不查询支付时间
     *               notCancelTime      不查询取消时间
     *               notFulfilTime      不查询完成时间
     *               notOtherTime       不查询其他时间
     *               notRemark          不查询备注
     *               limit              每页数量
     *               page               页数
     *               productFlag        是否关联订单商品
     * @return 订单分页信息
     */
    PageUtils<OrdersEntity> findPage(Map<String, Object> params);

    /**
     * 根据订单用户Id查找今日所有订单
     *
     * @param ordersUserId 订单用户id
     * @return 今日该用户所有订单
     */
    List<OrdersEntity> findNowByOrdersUserId(Long ordersUserId);

    /**
     * 根据订单类型和订单用户Id查找今日所有订单
     *
     * @param ordersUserId 订单用户id
     * @param ordersType   订单类型
     * @return 今日该用户所有订单
     */
    List<OrdersEntity> findNowByOrdersUserIdAndOrdersType(Long ordersUserId, Integer ordersType);

    /**
     * 根据订单类型和店铺(卖家)Id统计今日所有订单
     *
     * @param shopId     店铺(卖家)Id
     * @param ordersType 订单类型
     * @return 今日该用户所有订单
     */
    List<OrdersEntity> findNowByShopIdAndOrdersType(Long shopId, Integer ordersType);

    /**
     * 根据店铺id  查询所订单
     * @param params
     * @return
     */
    PageUtils<OrdersEntity> findPageByShopId(Map<String, Object> params);
}
